package com.cweb.framework.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import lombok.Data;

import java.io.File;
import java.util.Date;
import java.util.List;

/**
 * mybiats-plus 工具，自动生成map，xml，dao，service
 */
public class MybiatsPlusGenerator {
    // 生成处理(复数)
    public void execute(List<String> tableNameList) {
        for (String tableName : tableNameList) {
            this.execute(tableName);
        }
    }

    // 生成处理
    public void execute(String tableName) {
        // 取得相关路径
//        getPath();
        String path = new File(this.genSetting.getPath()).getPath();
        String splitPath[] = path.split("\\\\target\\\\classes\\\\");
        System.out.println(splitPath);
        rootPath = splitPath[0] + "\\\\src\\\\main\\\\java";
        packageName = splitPath[1].replaceAll("\\\\", ".");

        // 自定义模板
        // 以下任何一个模块如果设置 空 OR Null 将不生成该模块。
        TemplateConfig templateConfig = new TemplateConfig();
        if (!this.genSetting.isOutController()) templateConfig.setController("");
        if (!this.genSetting.isOutService()) templateConfig.setService("");
        if (!this.genSetting.isOutServiceImpl()) templateConfig.setServiceImpl("");
        if (!this.genSetting.isOutEntity()) templateConfig.setEntity("");
        if (!this.genSetting.isOutMapper()) templateConfig.setMapper("");
        if (!this.genSetting.isOutXml()) templateConfig.setXml("");

//        // 注入自定义
//        InjectionConfig cfg = new InjectionConfig() {
//            @Override
//            public void initMap() {
//                Map<String, Object> map = new HashMap<String, Object>();
//                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
//                this.setMap(map);
//            }
//        };

        // 数据库连接配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL) // 对应数据库：mysql
                .setUrl(this.genSetting.getDbUrl())
                .setUsername(this.genSetting.getDbUsername())
                .setPassword(this.genSetting.getDbPassword())
                .setDriverName("com.zaxxer.hikari.HikariDataSource");

        // 生成模式配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig
                .setCapitalMode(true)  // 是否全局大写
                .setEntityLombokModel(true) // Entity对象是否使用Lombok模式
//                .setDbColumnUnderline(false) // 下划线和驼峰转换
                .setNaming(NamingStrategy.underline_to_camel) // 下划线转驼峰
                .setInclude(new String[]{tableName})// 对象表名，多个表名传数组
                .setEntityTableFieldAnnotationEnable(true) // 使用TableField注解
                .setRestControllerStyle(true) // 使用RestController
                // 基础类
                .setSuperControllerClass("com.cweb.framework.base.controller.BaseController")
                .setSuperServiceImplClass("com.cweb.framework.base.serivce.BaseMybatisService")
                .setSuperEntityClass("com.cweb.framework.base.entity.BaseMybatisModel")
                .setSuperMapperClass("com.cweb.framework.base.mapper.BaseMybatisMapper")
        ;

        // 全局配置
        GlobalConfig config = new GlobalConfig();
        config.setActiveRecord(true)
                .setEnableCache(false) // 关闭二级缓存
                .setAuthor(this.genSetting.getAuthor()) // 作者名
                .setOutputDir(rootPath) // 根路径
                .setFileOverride(true) // 是否覆盖
                .setDateType(DateType.ONLY_DATE) // 时间类型，固定为date
                .setOpen(false) // 完成后不打开资源浏览器
                // 修改文件名
//                .setMapperName("%sDao")
                .setServiceImplName("%sService");


        // 包文件相关
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent(packageName);
        packageConfig.setModuleName("model." + (null == genSetting.getModuleName() ? "" : (genSetting.getModuleName() + ".")) + tableName);
        packageConfig.setController("controller");
        packageConfig.setEntity("entity");
        packageConfig.setMapper("mapper");
        packageConfig.setServiceImpl("service");
        packageConfig.setXml("xml");

        // 执行生成
        new AutoGenerator().setGlobalConfig(config)
                .setTemplate(templateConfig)
//                .setCfg(cfg)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(packageConfig)
                .execute();
    }

    // 路径
    private String packageName = ""; // 包名(自动填入)
    private String rootPath = ""; // 根路径(自动填入)
    // 配置信息
    private GenSetting genSetting;

    // 构造方法
    public MybiatsPlusGenerator(GenSetting genSetting) {
        this.genSetting = genSetting;
    }

    // ************************************************************* //
    // 取得当前位置
    private void getPath() {
        String retPath = "";
//        path = path.replaceAll("target\\\\classes","src\\\\main\\\\java");
    }
}
